#include <iostream>
#include <thread>
using namespace std;



/*首先要引入头文件#include<thread>(C++11的标准库中提供了多线程库)，该头文件中定义了thread类
 创建一个线程即实例化一个该类的对象，
实例化对象时候调用的构造函数需要传递一个参数，该参数就是函数名，
thread th1(proc1)；
如果传递进去的函数本身需要传递参数，实例化对象时将这些参数按序写到函数名后面，
thread th1(proc1,a,b);
只要创建了线程对象（传递“函数名/可调用对象”作为参数的情况下），线程就开始执行（std::thread 有一个无参构造函数重载的版本，不会创建底层的线程）。
有两种线程阻塞方法join()与detach()，
阻塞线程的目的是调节各线程的先后执行顺序，这里重点讲join()方法，不推荐使用detach()，
detach()使用不当会发生引用对象失效的错误。当线程启动后，一定要在和线程相关联的thread对象销毁前，对线程运用join()或者detach()。*/


void fun(int a)
{
    cout<<"-------------------子线程开始---------------------"<<endl;
    cout<<"我是子线程"<<"传入参数"<<a<<endl;
    this_thread::sleep_for(chrono::seconds(2));
    cout<<"子线程中显示线程id："<<this_thread::get_id()<<endl;
    cout<<"-------------------子线程结束---------------------"<<endl;

}
int main()
{
    cout << "我是主线程" << endl;
    int count=10;
    thread th(fun,count);
    int coun1=11;
     this_thread::sleep_for(chrono::seconds(2));
    thread th1(fun,coun1);
    cout<<"主线程中显示子线程的id"<<th.get_id()<<endl;
    cout<<"主线程中显示子线程的id"<<th1.get_id()<<endl;
    this_thread::sleep_for(chrono::seconds(3));
    th.join();//此时主线程被阻塞直至子线程执行结束
     th1.join();//此时主线程被阻塞直至子线程执行结束
    cout<<"子线程结束"<<endl;
    cout<<"主线成程序结束"<<endl;
    return 0;
}
